package com.radon.util;

import lombok.Data;
import lombok.Getter;

@Data
public class Constant {

    /**
     * 交换机路由
     */
    @Getter
    public enum  ExchangeEnum{
        //直接匹配,通过Exchange名称+RountingKey来发送与接收消息,是RabbitMQ默认的交换机模式，也是最简单的模式，根据key全文匹配去寻找队列.
        DIRECT_EXCHANGE("direct.exchange.demo"),
        //广播订阅,向所有的消费者发布消息,但是只有消费者将队列绑定到该路由器才能收到消息,忽略Routing Key.
        FANOUT_EXCHANGE("fanout.exchange.demo"),
        //主题匹配订阅,这里的主题指的是RoutingKey,RoutingKey可以采用通配符,如:*或#，RoutingKey命名采用.来分隔多个词,只有消息这将队列绑定到该路由器且指定RoutingKey符合匹配规则时才能收到消息;
        TOPIC_EXCHANGE("topic.exchange.demo"),
        //消息头订阅,消息发布前,为消息定义一个或多个键值对的消息头,然后消费者接收消息同时需要定义类似的键值对请求头:(如:x-mactch=all或者x_match=any)，只有请求头与消息头匹配,才能接收消息,忽略RoutingKey.
        HEADERS_EXCHANGE("headers.exchange.demo"),
        //默认的exchange:如果用空字符串去声明一个exchange，那么系统就会使用”amq.direct”这个exchange，我们创建一个queue时,默认的都会有一个和新建queue同名的routingKey绑定到这个默认的exchange上去
        DEFAULT_EXCHANGE("");
        private String value;

        ExchangeEnum(String value) {
            this.value = value;
        }
    }

    /**
     * 交换机路由
     */
    @Getter
    public enum  RoutingKeyEnum{
        //直接匹配,通过Exchange名称+RountingKey来发送与接收消息,是RabbitMQ默认的交换机模式，也是最简单的模式，根据key全文匹配去寻找队列.
        DIRECT_ROUTING_KEY("direct.rounting.key"),
        //广播订阅,向所有的消费者发布消息,但是只有消费者将队列绑定到该路由器才能收到消息,忽略Routing Key.
        FANOUT_ROUTING_KEY(""),
        //主题匹配订阅,这里的主题指的是RoutingKey,RoutingKey可以采用通配符,如:*或#，RoutingKey命名采用.来分隔多个词,只有消息这将队列绑定到该路由器且指定RoutingKey符合匹配规则时才能收到消息;
        TOPIC_ROUTING_KEY("topic.rounting.key"),
        //消息头订阅,消息发布前,为消息定义一个或多个键值对的消息头,然后消费者接收消息同时需要定义类似的键值对请求头:(如:x-mactch=all或者x_match=any)，只有请求头与消息头匹配,才能接收消息,忽略RoutingKey.
        HEADERS_ROUTING_KEY("headers.rounting.key"),
        //默认的exchange:如果用空字符串去声明一个exchange，那么系统就会使用”amq.direct”这个exchange，我们创建一个queue时,默认的都会有一个和新建queue同名的routingKey绑定到这个默认的exchange上去
        DEFAULT_ROUTING_KEY("");
        private String value;

        RoutingKeyEnum(String value) {
            this.value = value;
        }
    }

    @Getter
    public enum QueueEnum
    {
        /**
         * 用户注册枚举
         */
        DIRECT_QUEUE("direct.queue","direct.rounting.key"),
        FANOUT_QUEUE("fanout.queue",""),
        FANOUT_QUEUE_TWO("fanout.queue.two",""),
        TOPIC_QUEUE("topic.queue","topic.rounting.*"),
        TOPIC_QUEUE_TWO("topic.queue.two","topic.#"),
        ;
        /**
         * 队列名称
         */
        private String name;
        /**
         * 队列路由键
         */
        private String routingKey;

        QueueEnum(String name, String routingKey) {
            this.name = name;
            this.routingKey = routingKey;
        }
    }

}
